
            <!DOCTYPE html>
            <html lang="en">
            <head>
                <meta charset="UTF-8">
                <title>Kubernetes自定义监控指标——Prometheus Adapter实战演练</title>
            </head>
            <body>
            <a href="https://andyoung.blog.csdn.net">原作者博客</a>
            <div id="content_views" class="markdown_views prism-atom-one-light">
                    <svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
                        <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
                    </svg>
                    <h3><a id="1_0"></a>1、概述</h3> 
<p>kubernetes的监控指标分为两种：</p> 
<ul><li> <p>Core metrics(核心指标)：从 Kubelet、cAdvisor 等获取度量数据，再由<a href="https://blog.csdn.net/agonie201218/article/details/128339568">metrics-server</a>提供给 kube-scheduler、HPA、 控制器等使用。</p> </li><li> <p>Custom Metrics(自定义指标)：由Prometheus Adapter提供API custom.metrics.k8s.io，由此可支持任意Prometheus采集到的指标。</p> </li></ul> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/722a7decabb1861f2bf193f55f8404fa.png" alt="请添加图片描述"></p> 
<p>核心指标只包含node和pod的cpu、内存，<strong>一般来说，核心指标作HPA已经足够，但如果想根据自定义指标:如请求qps/5xx错误数来实现HPA，就需要使用自定义指标了</strong>，<strong>目前Kubernetes中</strong>自定义指标一般由Prometheus来提供，再利用<code>prometheus-adpater</code>（自定义apiserver）聚合到原生kubernetes apiserver，实现和核心指标（<a href="https://blog.csdn.net/agonie201218/article/details/128339568">metric-server</a>)同样的效果。聚合自定义apiserver请参考<a href="https://blog.csdn.net/agonie201218/article/details/128339568">Kubernetes核心指标监控——Metrics Server </a> 这篇博文，本文不再赘余。</p> 
<h3><a id="2prometheusadpater_12"></a>2、部署prometheus-adpater</h3> 
<p>Prometheus可以采集其它各种指标，但是prometheus采集到的metrics并不能直接给kubernetes用，因为两者数据格式不兼容，因此还需要另外一个组件(<strong>kube-state-metrics</strong>)，将prometheus的metrics数据格式转换成k8s API接口能识别的格式，转换以后，因为是自定义API，所以还需要用Kubernetes aggregator在主API服务器中注册，以便直接通过/apis/来访问。</p> 
<p>文件清单：</p> 
<ul><li><a href="https://github.com/prometheus/node_exporter">node-exporter</a>：prometheus的exporter，收集Node级别的监控数据</li><li><a href="https://prometheus.io/" rel="nofollow">prometheus</a>：监控服务端，从node-exporter拉数据并存储为时序数据。</li><li><a href="https://github.com/kubernetes/kube-state-metrics">kube-state-metrics</a>：将prometheus中可以用PromQL查询到的指标数据转换成k8s对应的数据。</li><li><a href="https://github.com/directxman12/k8s-prometheus-adapter">prometheus-adpater</a>：聚合进apiserver，即一种<a href="https://github.com/kubernetes-incubator/custom-metrics-apiserver">custom-metrics-apiserver</a>实现</li><li>开启Kubernetes aggregator功能（开启方法可以参考官方社区的文档）</li></ul> 
<blockquote> 
 <p>快速方便部署prometheus 可以参考这个 <a href="https://andyoung.blog.csdn.net/article/details/127965449" rel="nofollow">Prometheus Operator 极简配置方式在k8s一条龙安装Prometheus 监控</a></p> 
</blockquote> 
<p>k8s-prometheus-adapter的部署文件：</p> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/1a0059491adebc98725f5b3558d9f0b6.png" alt="请添加图片描述"></p> 
<p>其中创建了一个叫做cm-adapter-serving-certs的secret，包含两个值: serving.crt和serving.key，这是由apiserver信任的证书。kube-prometheus项目中的gencerts.sh和deploy.sh脚本可以创建这个secret。包括secret的所有资源，都在custom-metrics命名空间下，因此需要<code>kubectl create namespace custom-metrics</code>。</p> 
<p>以上组件均部署成功后，可以通过url获取指标</p> 
<h3><a id="httpsimgblogcsdnimgcn213640b6777f42a8a19cf46d23f8ebaejpeg3HPA_36"></a><img src="https://i-blog.csdnimg.cn/blog_migrate/e26c9c52c4c86b6750b6596eef69f9ff.jpeg" alt="请添加图片描述">3、基于自定义指标的HPA</h3> 
<p>使用prometheus后，pod有一些自定义指标，如http_request请求数</p> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/9787b043e4273d7d1891e8d6b4d4fbbb.png" alt="img"></p> 
<p>创建一个HPA，当请求数超过每秒10次时进行自动扩容</p> 
<pre><code>apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: podinfo
spec:
  scaleTargetRef:
    apiVersion: extensions/v1beta1
    kind: Deployment
    name: podinfo
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Pods
    pods:
      metricName: http_requests
      targetAverageValue: 10
</code></pre> 
<p>查看HPA：</p> 
<pre><code>$ kubectl get hpa
NAME      REFERENCE            TARGETS     MINPODS   MAXPODS   REPLICAS   AGE
podinfo   Deployment/podinfo   899m / 10   2         10        2          1m
</code></pre> 
<p>对Pod试压：</p> 
<pre><code>#install hey
$ go get -u github.com/rakyll/hey&lt;br&gt;
#do 10K requests rate limited at 25 QPS
$ hey -n 10000 -q 5 -c 5 http://PODINFO_SVC_IP:9898/healthz
</code></pre> 
<p>HPA发挥作用：</p> 
<pre><code>Events:
  Type    Reason             Age   From                       Message
  ----    ------             ----  ----                       -------
  Normal  SuccessfulRescale  5m    horizontal-pod-autoscaler  New size: 3; reason: pods metric http_requests above target
  Normal  SuccessfulRescale  21s   horizontal-pod-autoscaler  New size: 2; reason: All metrics below target
</code></pre> 
<h3><a id="4prometheusadapter_92"></a>4、关于prometheus-adapter</h3> 
<p>其实prometheus-adapter既包含自定义指标，又包含核心指标，即如果安装了prometheus，且指标都采集完整，k8s-prometheus-adapter可以替代metrics server。</p> 
<p>在1.6以上的集群中，prometheus-adapter可以适配autoscaling/v2的HPA。</p> 
<p>因为一般是部署在集群内，所以prometheus-adapter默认情况下，使用<a href="https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster/#accessing-the-api-from-a-pod" rel="nofollow">in-cluster</a>的认证方式，以下是主要参数：</p> 
<ul><li>lister-kubeconfig: 默认使用in-cluster方式</li><li>metrics-relist-interval: 更新metric缓存值的间隔，最好大于等于Prometheus 的scrape interval，不然数据会为空</li><li>prometheus-url: 对应连接的prometheus地址</li><li>config： 一个yaml文件，配置如何从prometheus获取数据，并与k8s的资源做对应，以及如何在api接口中展示。</li></ul> 
<h3><a id="5_105"></a>5、总结</h3> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/5db3f0429d2db0a262f065b3b51e9a1b.png" alt="img"></p> 
<p>kubernetes自定义监控指标prometheus-adapter一般通过Prometheus来提供监控指标数据（其他自定义监控指标采集工具还包括Microsoft Azure Adapter、Google Stackdriver等），一般来说，核心指标作HPA已经足够，但如果想根据自定义指标:如请求qps/5xx错误数来实现HPA，这时候就需要在集群中部署prometheus-adapter了，通过将prometheus-adpater（自定义apiserver）聚合到原生kubernetes apiserver，实现和核心指标（<a href="https://www.cnblogs.com/zhangmingcheng/p/15770672.html" rel="nofollow">metric-server</a>)同样的效果。</p> 
<p>参考：https://yasongxu.gitbook.io/container-monitor/yi-.-kai-yuan-fang-an/di-1-zhang-cai-ji/custom-metrics</p> 
<p>参考：https://www.shouxicto.com/article/897.html</p> 
<p>参考：<a href="https://andyoung.blog.csdn.net/article/details/127965449" rel="nofollow">Prometheus Operator 极简配置方式在k8s一条龙安装Prometheus 监控</a></p>
                </div>
            </body>
            </html>
            